{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1 引言"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "逻辑不逻辑，回归非回归。\n",
    "\n",
    "回想当年初次学习逻辑回归算法时，看到”逻辑回归“这个名字，第一感觉是这是一个与线性回归类似的回归类别的算法，只不过这个算法突出”逻辑“，或者与某个以”逻辑“命名的知识点有关。可后来却发现，这是一个坑死人不偿命的名字——逻辑回归算法不是回归算法，是分类算法，也与逻辑无关，要说有关也仅是因为它的英文名字是Loginstics，音译为逻辑而已（所以也有资料称之为逻辑斯蒂回归)。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2 逻辑回归原理\n",
    "## 2.1 从线性回归到逻辑回归"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在上一篇博文中，我们详细说过回归算法与分类算法的区别。逻辑回归既然是分类算法，为什么不叫逻辑分类而是逻辑回归呢？在我看来，这是因为逻辑回归用回归的思路去解决分类的问题。\n",
    "\n",
    "假设有如下图所示的一个数据集，使用线性回归算法，我们可以找到大致如黑线的一个线性模型对其进行拟合。对于回归算法，需要做的是对数据集中每一个xi\n",
    "，都能通过模型找到一个yi（预测值）与之对应。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![image]()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "获得了预测值${{y}_{i}}$，我们就可以做很多事情了，例如：分类。我们可以对${{y}_{i}}$进行分段，例如，在${{y}}$轴上取一值$M$，当${{y}_{i}}<M$时，我们将其标记到类0中，当${{y}_{i}}>M$时，我们将其标记到另一类1中，如下图所示："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![image]()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这就实现了以回归的思路来实现分类。\n",
    "\n",
    "但逻辑回归可不止在线性回归的基础上做这些事情。在上一篇介绍线性回归的博文的末尾，我们提到，线性回归有一个很致命的缺陷——对异常值很敏感，如果数据集中出现异常值，拟合出来的线性模型也将出现很大变化，预测出来的结果也将不在那么准确，从而到导致分类错误。如下图所示，数据集中出现一个异常点（绿点），那么拟合出来的模型就可能从原来的黑线变为绿线，此时，当数据集中有某一点$x\\in ({{x}_{1}},{{x}_{2}})$时，该点就回被误判，例如图中橙色点，在原本黑线模型中，该点预测出来的${{y}}$值大于$M$，被标记到1类中，但在绿线模型中，其${{y}}$值就小于$M$，就回被误标记到0类中。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![image]()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "逻辑回归算法对线性回归对异常数据敏感的不足进行了优化改进。怎么改进呢？最直观的方法就是将直线“掰弯”。“掰弯”之后，就算出现异常数据，模型主体部分也不会出现太多改变，从而解决线性回归模型对异常值敏感的问题，如下图所示："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![image]()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "而我们所用的“掰弯”方法就是用sigmod函数与线性函数进行复合。\n",
    "\n",
    "## 2.2 sigmod函数\n",
    "\n",
    "sigmoid函数也叫Logistic函数，函数表达式如下：\n",
    "\n",
    "$$g(z)=\\frac{1}{1+{{e}^{-x}}}$$\n",
    "\n",
    "其中，$e$为自然对数，是一个常数，值约为2.71828。\n",
    "\n",
    "函数图像如下："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![image]()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从函数图像可以看出， sigmoid函数可以很好地将$(-\\infty ,+\\infty )$内的数映射到$(0,1)$ 上，于是我们可以将$g(z)\\ge 0.5$时我们可以将该条数据标记为1类， $g(z)<0.5$时标记为0类。即：  \n",
    "\n",
    "$$y=\\left\\{ _{0,\\text{    }g(z)<0.5}^{1,\\text{    }g(z)\\ge 0.5} \\right.$$\n",
    "\n",
    "其中$y$表示分类结果。  \n",
    "\n",
    "通常，在逻辑回归算法应用中，模型可不会如同上面的sigmoid函数那么简单，而是sigmoid函数与线性函数的组合：  \n",
    "\n",
    "$$g(z)=\\frac{1}{1+{{e}^{-z}}}$$\n",
    "\n",
    "其中，$z$就是线性回归中的预测值，即：  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$z=f(x)={{\\theta }_{0}}+{{\\theta }_{1}}{{x}_{1}}+{{\\theta }_{2}}{{x}_{2}}+\\cdots +{{\\theta }_{n}}{{x}_{n}}$$\n",
    "所以有：\n",
    "\n",
    "$$h(x)=\\frac{1}{1+{{e}^{-({{\\theta }_{0}}+{{\\theta }_{1}}{{x}_{1}}+{{\\theta }_{2}}{{x}_{2}}+\\cdots +{{\\theta }_{n}}{{x}_{n}})}}}$$\n",
    "用矩阵方式表示：\n",
    "$$h(x)=g(z)=g({{\\theta }^{T}}x)=\\frac{1}{1+{{e}^{-{{\\theta }^{T}}x}}}$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "其中，$\\theta =\\left[ \\begin{matrix}\n",
    "   {{\\theta }_{0}}  \\\\\n",
    "   {{\\theta }_{1}}  \\\\\n",
    "   \\vdots   \\\\\n",
    "   {{\\theta }_{n}}  \\\\\n",
    "\\end{matrix} \\right]$,  $x=\\left[ \\begin{matrix}\n",
    "   {{x}_{0}}  \\\\\n",
    "   {{x}_{1}}  \\\\\n",
    "   \\vdots   \\\\\n",
    "   {{x}_{n}}  \\\\\n",
    "\\end{matrix} \\right]$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3 损失函数\n",
    "下一步我们要做的就是如何求取最佳拟合模型的问题了。在线性回归算法中，我们使用误差平方和或者均方误差来作为损失函数，但是在逻辑回归中，这个方法不再使用，因为已被证明，在逻辑回归模型中使用误差平方和作为损失函数的话，会存在在许多局部最小值点，在求解参数的过程中很容易陷入局部最小值点，而无法求得真正的最小值点。\n",
    "\n",
    "上面说过，$h(x)\\in (0,1)$，这一点的性质刚好与概率$p\\in [0,1]$的性质吻合（当做概率使用的理由不止这点），故而我们可以将其当做$h(x)$值当做数据被标记为1类的概率，即："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$p(y=1|x;\\theta )=h(x)$$\n",
    "$$p(y=0|x;\\theta )=1-h(x)$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "当给定$y$为1时，即属于1类时，$h(x)$越趋近于1，被预测为1类的概率就越大，损失（误差）就越小；反之，当给定% $y$为0时，即属于0类时，$h(x)$越趋近于1，被预测为0类的概率就越小，损失（误差）就越大，于是，我们可以定义损失函数："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$\\cos t(h(x),y)=\\left\\{ _{-\\log (1-h(x)),\\text{    }y=0}^{-\\log (h(x)),\\text{        }y=1} \\right.$$\n",
    "\n",
    "对所有数据集中$x$损失累加然后求平均，有：\n",
    "\n",
    "$$J(\\theta )=-\\frac{1}{m}\\sum\\limits_{i=1}^{m}{\\cos (h(x),y)}$$\n",
    "\n",
    "由于$y$的取值为0或1，结合上面两个公式可以得到：\n",
    "\n",
    "$$J(\\theta )=-\\frac{1}{m}\\sum\\limits_{i=1}^{m}{({{y}_{i}}\\log (h({{x}_{i}}))+(1-{{y}_{i}})\\log (1-h({{x}_{i}})))}$$\n",
    "\n",
    "这个函数就是我们逻辑回归的损失函数,我们把它称为交叉熵损失函数。\n",
    "\n",
    "接下来就是针对的优化问题，也就是求得最小值，在[这位大佬的博客](https://blog.csdn.net/ligang_csdn/article/details/53838743)里推导过程写得很详细，我自愧不如，就不献丑了。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4 代码实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "from torch import nn\n",
    "from torch.autograd import Variable\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 制造数据\n",
    "n_data = torch.ones(100, 2)         # 数据的基本形态\n",
    "x0 = torch.normal(2*n_data, 1)      # 类型0 x data (tensor), shape=(100, 2)\n",
    "y0 = torch.zeros(100)               # 类型0 y data (tensor), shape=(100, 1)\n",
    "x1 = torch.normal(-2*n_data, 1)     # 类型1 x data (tensor), shape=(100, 1)\n",
    "y1 = torch.ones(100)                # 类型1 y data (tensor), shape=(100, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 注意 x, y 数据的数据形式是一定要像下面一样 (torch.cat 是在合并数据)\n",
    "x = torch.cat((x0, x1), 0).type(torch.FloatTensor)  # FloatTensor = 32-bit floating\n",
    "y = torch.cat((y0, y1), 0).type(torch.FloatTensor)    # LongTensor = 64-bit integer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画图\n",
    "plt.scatter(x.data.numpy()[:, 0], x.data.numpy()[:, 1], c=y.data.numpy(), s=100, lw=0, cmap='RdYlGn')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "class LogisticRegression(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(LogisticRegression, self).__init__()\n",
    "        self.lr = nn.Linear(2, 1)\n",
    "        self.sm = nn.Sigmoid()\n",
    " \n",
    "    def forward(self, x):\n",
    "        x = self.lr(x)\n",
    "        x = self.sm(x)\n",
    "        return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "logistic_model = LogisticRegression()\n",
    "if torch.cuda.is_available():\n",
    "    logistic_model.cuda()\n",
    " \n",
    "# 定义损失函数和优化器\n",
    "criterion = nn.BCELoss()\n",
    "optimizer = torch.optim.SGD(logistic_model.parameters(), lr=1e-3, momentum=0.9)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/chb/anaconda3/envs/study_python/lib/python3.7/site-packages/torch/nn/modules/loss.py:498: UserWarning: Using a target size (torch.Size([200])) that is different to the input size (torch.Size([200, 1])) is deprecated. Please ensure they have the same size.\n",
      "  return F.binary_cross_entropy(input, target, weight=self.weight, reduction=self.reduction)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "**********\n",
      "epoch 20\n",
      "loss is 1.3634\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 40\n",
      "loss is 0.7231\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 60\n",
      "loss is 0.4159\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 80\n",
      "loss is 0.2842\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 100\n",
      "loss is 0.2185\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 120\n",
      "loss is 0.1796\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 140\n",
      "loss is 0.1537\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 160\n",
      "loss is 0.1352\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 180\n",
      "loss is 0.1211\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 200\n",
      "loss is 0.1100\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 220\n",
      "loss is 0.1010\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 240\n",
      "loss is 0.0936\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 260\n",
      "loss is 0.0873\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 280\n",
      "loss is 0.0820\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 300\n",
      "loss is 0.0773\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 320\n",
      "loss is 0.0733\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 340\n",
      "loss is 0.0697\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 360\n",
      "loss is 0.0665\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 380\n",
      "loss is 0.0636\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 400\n",
      "loss is 0.0610\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 420\n",
      "loss is 0.0586\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 440\n",
      "loss is 0.0565\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 460\n",
      "loss is 0.0545\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 480\n",
      "loss is 0.0527\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 500\n",
      "loss is 0.0510\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 520\n",
      "loss is 0.0494\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 540\n",
      "loss is 0.0480\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 560\n",
      "loss is 0.0466\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 580\n",
      "loss is 0.0454\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 600\n",
      "loss is 0.0442\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 620\n",
      "loss is 0.0431\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 640\n",
      "loss is 0.0420\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 660\n",
      "loss is 0.0410\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 680\n",
      "loss is 0.0401\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 700\n",
      "loss is 0.0392\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 720\n",
      "loss is 0.0384\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 740\n",
      "loss is 0.0376\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 760\n",
      "loss is 0.0368\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 780\n",
      "loss is 0.0361\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 800\n",
      "loss is 0.0354\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 820\n",
      "loss is 0.0348\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 840\n",
      "loss is 0.0341\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 860\n",
      "loss is 0.0335\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 880\n",
      "loss is 0.0329\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 900\n",
      "loss is 0.0324\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 920\n",
      "loss is 0.0319\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 940\n",
      "loss is 0.0314\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 960\n",
      "loss is 0.0309\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 980\n",
      "loss is 0.0304\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1000\n",
      "loss is 0.0299\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1020\n",
      "loss is 0.0295\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1040\n",
      "loss is 0.0291\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1060\n",
      "loss is 0.0287\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1080\n",
      "loss is 0.0283\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1100\n",
      "loss is 0.0279\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1120\n",
      "loss is 0.0275\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1140\n",
      "loss is 0.0271\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1160\n",
      "loss is 0.0268\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1180\n",
      "loss is 0.0265\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1200\n",
      "loss is 0.0261\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1220\n",
      "loss is 0.0258\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1240\n",
      "loss is 0.0255\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1260\n",
      "loss is 0.0252\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1280\n",
      "loss is 0.0249\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1300\n",
      "loss is 0.0246\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1320\n",
      "loss is 0.0244\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1340\n",
      "loss is 0.0241\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1360\n",
      "loss is 0.0238\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1380\n",
      "loss is 0.0236\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1400\n",
      "loss is 0.0233\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1420\n",
      "loss is 0.0231\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1440\n",
      "loss is 0.0229\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1460\n",
      "loss is 0.0226\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1480\n",
      "loss is 0.0224\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1500\n",
      "loss is 0.0222\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1520\n",
      "loss is 0.0220\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1540\n",
      "loss is 0.0218\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1560\n",
      "loss is 0.0216\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1580\n",
      "loss is 0.0214\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1600\n",
      "loss is 0.0212\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1620\n",
      "loss is 0.0210\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1640\n",
      "loss is 0.0208\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1660\n",
      "loss is 0.0206\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1680\n",
      "loss is 0.0204\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1700\n",
      "loss is 0.0203\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1720\n",
      "loss is 0.0201\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1740\n",
      "loss is 0.0199\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1760\n",
      "loss is 0.0198\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1780\n",
      "loss is 0.0196\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1800\n",
      "loss is 0.0194\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1820\n",
      "loss is 0.0193\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1840\n",
      "loss is 0.0191\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1860\n",
      "loss is 0.0190\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1880\n",
      "loss is 0.0188\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1900\n",
      "loss is 0.0187\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1920\n",
      "loss is 0.0186\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1940\n",
      "loss is 0.0184\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1960\n",
      "loss is 0.0183\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 1980\n",
      "loss is 0.0182\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2000\n",
      "loss is 0.0180\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2020\n",
      "loss is 0.0179\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2040\n",
      "loss is 0.0178\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2060\n",
      "loss is 0.0177\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2080\n",
      "loss is 0.0175\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2100\n",
      "loss is 0.0174\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2120\n",
      "loss is 0.0173\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2140\n",
      "loss is 0.0172\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2160\n",
      "loss is 0.0171\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2180\n",
      "loss is 0.0170\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2200\n",
      "loss is 0.0168\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2220\n",
      "loss is 0.0167\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2240\n",
      "loss is 0.0166\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2260\n",
      "loss is 0.0165\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2280\n",
      "loss is 0.0164\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2300\n",
      "loss is 0.0163\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2320\n",
      "loss is 0.0162\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2340\n",
      "loss is 0.0161\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2360\n",
      "loss is 0.0160\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2380\n",
      "loss is 0.0159\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2400\n",
      "loss is 0.0158\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2420\n",
      "loss is 0.0157\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2440\n",
      "loss is 0.0156\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2460\n",
      "loss is 0.0156\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2480\n",
      "loss is 0.0155\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2500\n",
      "loss is 0.0154\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2520\n",
      "loss is 0.0153\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2540\n",
      "loss is 0.0152\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2560\n",
      "loss is 0.0151\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2580\n",
      "loss is 0.0150\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2600\n",
      "loss is 0.0150\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2620\n",
      "loss is 0.0149\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2640\n",
      "loss is 0.0148\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2660\n",
      "loss is 0.0147\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2680\n",
      "loss is 0.0146\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2700\n",
      "loss is 0.0146\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2720\n",
      "loss is 0.0145\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2740\n",
      "loss is 0.0144\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2760\n",
      "loss is 0.0143\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2780\n",
      "loss is 0.0143\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2800\n",
      "loss is 0.0142\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2820\n",
      "loss is 0.0141\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2840\n",
      "loss is 0.0141\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2860\n",
      "loss is 0.0140\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2880\n",
      "loss is 0.0139\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2900\n",
      "loss is 0.0138\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2920\n",
      "loss is 0.0138\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2940\n",
      "loss is 0.0137\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2960\n",
      "loss is 0.0137\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 2980\n",
      "loss is 0.0136\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3000\n",
      "loss is 0.0135\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3020\n",
      "loss is 0.0135\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3040\n",
      "loss is 0.0134\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3060\n",
      "loss is 0.0133\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3080\n",
      "loss is 0.0133\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3100\n",
      "loss is 0.0132\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3120\n",
      "loss is 0.0132\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3140\n",
      "loss is 0.0131\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3160\n",
      "loss is 0.0130\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3180\n",
      "loss is 0.0130\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3200\n",
      "loss is 0.0129\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3220\n",
      "loss is 0.0129\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3240\n",
      "loss is 0.0128\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3260\n",
      "loss is 0.0128\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3280\n",
      "loss is 0.0127\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3300\n",
      "loss is 0.0126\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3320\n",
      "loss is 0.0126\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3340\n",
      "loss is 0.0125\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3360\n",
      "loss is 0.0125\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3380\n",
      "loss is 0.0124\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3400\n",
      "loss is 0.0124\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3420\n",
      "loss is 0.0123\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3440\n",
      "loss is 0.0123\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3460\n",
      "loss is 0.0122\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3480\n",
      "loss is 0.0122\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3500\n",
      "loss is 0.0121\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3520\n",
      "loss is 0.0121\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3540\n",
      "loss is 0.0120\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3560\n",
      "loss is 0.0120\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3580\n",
      "loss is 0.0119\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3600\n",
      "loss is 0.0119\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3620\n",
      "loss is 0.0119\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3640\n",
      "loss is 0.0118\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3660\n",
      "loss is 0.0118\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3680\n",
      "loss is 0.0117\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3700\n",
      "loss is 0.0117\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3720\n",
      "loss is 0.0116\n",
      "acc is 100.0000\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "**********\n",
      "epoch 3740\n",
      "loss is 0.0116\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3760\n",
      "loss is 0.0115\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3780\n",
      "loss is 0.0115\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3800\n",
      "loss is 0.0115\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3820\n",
      "loss is 0.0114\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3840\n",
      "loss is 0.0114\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3860\n",
      "loss is 0.0113\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3880\n",
      "loss is 0.0113\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3900\n",
      "loss is 0.0113\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3920\n",
      "loss is 0.0112\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3940\n",
      "loss is 0.0112\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3960\n",
      "loss is 0.0111\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 3980\n",
      "loss is 0.0111\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4000\n",
      "loss is 0.0111\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4020\n",
      "loss is 0.0110\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4040\n",
      "loss is 0.0110\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4060\n",
      "loss is 0.0109\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4080\n",
      "loss is 0.0109\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4100\n",
      "loss is 0.0109\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4120\n",
      "loss is 0.0108\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4140\n",
      "loss is 0.0108\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4160\n",
      "loss is 0.0108\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4180\n",
      "loss is 0.0107\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4200\n",
      "loss is 0.0107\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4220\n",
      "loss is 0.0107\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4240\n",
      "loss is 0.0106\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4260\n",
      "loss is 0.0106\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4280\n",
      "loss is 0.0105\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4300\n",
      "loss is 0.0105\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4320\n",
      "loss is 0.0105\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4340\n",
      "loss is 0.0104\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4360\n",
      "loss is 0.0104\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4380\n",
      "loss is 0.0104\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4400\n",
      "loss is 0.0103\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4420\n",
      "loss is 0.0103\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4440\n",
      "loss is 0.0103\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4460\n",
      "loss is 0.0103\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4480\n",
      "loss is 0.0102\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4500\n",
      "loss is 0.0102\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4520\n",
      "loss is 0.0102\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4540\n",
      "loss is 0.0101\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4560\n",
      "loss is 0.0101\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4580\n",
      "loss is 0.0101\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4600\n",
      "loss is 0.0100\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4620\n",
      "loss is 0.0100\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4640\n",
      "loss is 0.0100\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4660\n",
      "loss is 0.0099\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4680\n",
      "loss is 0.0099\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4700\n",
      "loss is 0.0099\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4720\n",
      "loss is 0.0099\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4740\n",
      "loss is 0.0098\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4760\n",
      "loss is 0.0098\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4780\n",
      "loss is 0.0098\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4800\n",
      "loss is 0.0097\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4820\n",
      "loss is 0.0097\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4840\n",
      "loss is 0.0097\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4860\n",
      "loss is 0.0097\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4880\n",
      "loss is 0.0096\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4900\n",
      "loss is 0.0096\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4920\n",
      "loss is 0.0096\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4940\n",
      "loss is 0.0096\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4960\n",
      "loss is 0.0095\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 4980\n",
      "loss is 0.0095\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5000\n",
      "loss is 0.0095\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5020\n",
      "loss is 0.0094\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5040\n",
      "loss is 0.0094\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5060\n",
      "loss is 0.0094\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5080\n",
      "loss is 0.0094\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5100\n",
      "loss is 0.0093\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5120\n",
      "loss is 0.0093\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5140\n",
      "loss is 0.0093\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5160\n",
      "loss is 0.0093\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5180\n",
      "loss is 0.0092\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5200\n",
      "loss is 0.0092\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5220\n",
      "loss is 0.0092\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5240\n",
      "loss is 0.0092\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5260\n",
      "loss is 0.0091\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5280\n",
      "loss is 0.0091\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5300\n",
      "loss is 0.0091\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5320\n",
      "loss is 0.0091\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5340\n",
      "loss is 0.0091\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5360\n",
      "loss is 0.0090\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5380\n",
      "loss is 0.0090\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5400\n",
      "loss is 0.0090\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5420\n",
      "loss is 0.0090\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5440\n",
      "loss is 0.0089\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5460\n",
      "loss is 0.0089\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5480\n",
      "loss is 0.0089\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5500\n",
      "loss is 0.0089\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5520\n",
      "loss is 0.0088\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5540\n",
      "loss is 0.0088\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5560\n",
      "loss is 0.0088\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5580\n",
      "loss is 0.0088\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5600\n",
      "loss is 0.0088\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5620\n",
      "loss is 0.0087\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5640\n",
      "loss is 0.0087\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5660\n",
      "loss is 0.0087\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5680\n",
      "loss is 0.0087\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5700\n",
      "loss is 0.0087\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5720\n",
      "loss is 0.0086\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5740\n",
      "loss is 0.0086\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5760\n",
      "loss is 0.0086\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5780\n",
      "loss is 0.0086\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5800\n",
      "loss is 0.0085\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5820\n",
      "loss is 0.0085\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5840\n",
      "loss is 0.0085\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5860\n",
      "loss is 0.0085\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5880\n",
      "loss is 0.0085\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5900\n",
      "loss is 0.0084\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5920\n",
      "loss is 0.0084\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5940\n",
      "loss is 0.0084\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5960\n",
      "loss is 0.0084\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 5980\n",
      "loss is 0.0084\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6000\n",
      "loss is 0.0084\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6020\n",
      "loss is 0.0083\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6040\n",
      "loss is 0.0083\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6060\n",
      "loss is 0.0083\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6080\n",
      "loss is 0.0083\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6100\n",
      "loss is 0.0083\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6120\n",
      "loss is 0.0082\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6140\n",
      "loss is 0.0082\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6160\n",
      "loss is 0.0082\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6180\n",
      "loss is 0.0082\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6200\n",
      "loss is 0.0082\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6220\n",
      "loss is 0.0081\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6240\n",
      "loss is 0.0081\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6260\n",
      "loss is 0.0081\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6280\n",
      "loss is 0.0081\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6300\n",
      "loss is 0.0081\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6320\n",
      "loss is 0.0081\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6340\n",
      "loss is 0.0080\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6360\n",
      "loss is 0.0080\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6380\n",
      "loss is 0.0080\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6400\n",
      "loss is 0.0080\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6420\n",
      "loss is 0.0080\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6440\n",
      "loss is 0.0080\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6460\n",
      "loss is 0.0079\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6480\n",
      "loss is 0.0079\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6500\n",
      "loss is 0.0079\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6520\n",
      "loss is 0.0079\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6540\n",
      "loss is 0.0079\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6560\n",
      "loss is 0.0079\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6580\n",
      "loss is 0.0078\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6600\n",
      "loss is 0.0078\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6620\n",
      "loss is 0.0078\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6640\n",
      "loss is 0.0078\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6660\n",
      "loss is 0.0078\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6680\n",
      "loss is 0.0078\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6700\n",
      "loss is 0.0077\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6720\n",
      "loss is 0.0077\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6740\n",
      "loss is 0.0077\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6760\n",
      "loss is 0.0077\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6780\n",
      "loss is 0.0077\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6800\n",
      "loss is 0.0077\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6820\n",
      "loss is 0.0076\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6840\n",
      "loss is 0.0076\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6860\n",
      "loss is 0.0076\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6880\n",
      "loss is 0.0076\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6900\n",
      "loss is 0.0076\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6920\n",
      "loss is 0.0076\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6940\n",
      "loss is 0.0076\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6960\n",
      "loss is 0.0075\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 6980\n",
      "loss is 0.0075\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7000\n",
      "loss is 0.0075\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7020\n",
      "loss is 0.0075\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7040\n",
      "loss is 0.0075\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7060\n",
      "loss is 0.0075\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7080\n",
      "loss is 0.0075\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7100\n",
      "loss is 0.0074\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7120\n",
      "loss is 0.0074\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7140\n",
      "loss is 0.0074\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7160\n",
      "loss is 0.0074\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7180\n",
      "loss is 0.0074\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7200\n",
      "loss is 0.0074\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7220\n",
      "loss is 0.0074\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7240\n",
      "loss is 0.0073\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7260\n",
      "loss is 0.0073\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7280\n",
      "loss is 0.0073\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7300\n",
      "loss is 0.0073\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7320\n",
      "loss is 0.0073\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7340\n",
      "loss is 0.0073\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7360\n",
      "loss is 0.0073\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7380\n",
      "loss is 0.0072\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7400\n",
      "loss is 0.0072\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7420\n",
      "loss is 0.0072\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7440\n",
      "loss is 0.0072\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7460\n",
      "loss is 0.0072\n",
      "acc is 100.0000\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "**********\n",
      "epoch 7480\n",
      "loss is 0.0072\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7500\n",
      "loss is 0.0072\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7520\n",
      "loss is 0.0071\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7540\n",
      "loss is 0.0071\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7560\n",
      "loss is 0.0071\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7580\n",
      "loss is 0.0071\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7600\n",
      "loss is 0.0071\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7620\n",
      "loss is 0.0071\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7640\n",
      "loss is 0.0071\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7660\n",
      "loss is 0.0071\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7680\n",
      "loss is 0.0070\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7700\n",
      "loss is 0.0070\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7720\n",
      "loss is 0.0070\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7740\n",
      "loss is 0.0070\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7760\n",
      "loss is 0.0070\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7780\n",
      "loss is 0.0070\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7800\n",
      "loss is 0.0070\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7820\n",
      "loss is 0.0070\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7840\n",
      "loss is 0.0069\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7860\n",
      "loss is 0.0069\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7880\n",
      "loss is 0.0069\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7900\n",
      "loss is 0.0069\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7920\n",
      "loss is 0.0069\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7940\n",
      "loss is 0.0069\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7960\n",
      "loss is 0.0069\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 7980\n",
      "loss is 0.0069\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8000\n",
      "loss is 0.0069\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8020\n",
      "loss is 0.0068\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8040\n",
      "loss is 0.0068\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8060\n",
      "loss is 0.0068\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8080\n",
      "loss is 0.0068\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8100\n",
      "loss is 0.0068\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8120\n",
      "loss is 0.0068\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8140\n",
      "loss is 0.0068\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8160\n",
      "loss is 0.0068\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8180\n",
      "loss is 0.0067\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8200\n",
      "loss is 0.0067\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8220\n",
      "loss is 0.0067\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8240\n",
      "loss is 0.0067\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8260\n",
      "loss is 0.0067\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8280\n",
      "loss is 0.0067\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8300\n",
      "loss is 0.0067\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8320\n",
      "loss is 0.0067\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8340\n",
      "loss is 0.0067\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8360\n",
      "loss is 0.0066\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8380\n",
      "loss is 0.0066\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8400\n",
      "loss is 0.0066\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8420\n",
      "loss is 0.0066\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8440\n",
      "loss is 0.0066\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8460\n",
      "loss is 0.0066\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8480\n",
      "loss is 0.0066\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8500\n",
      "loss is 0.0066\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8520\n",
      "loss is 0.0066\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8540\n",
      "loss is 0.0066\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8560\n",
      "loss is 0.0065\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8580\n",
      "loss is 0.0065\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8600\n",
      "loss is 0.0065\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8620\n",
      "loss is 0.0065\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8640\n",
      "loss is 0.0065\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8660\n",
      "loss is 0.0065\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8680\n",
      "loss is 0.0065\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8700\n",
      "loss is 0.0065\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8720\n",
      "loss is 0.0065\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8740\n",
      "loss is 0.0064\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8760\n",
      "loss is 0.0064\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8780\n",
      "loss is 0.0064\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8800\n",
      "loss is 0.0064\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8820\n",
      "loss is 0.0064\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8840\n",
      "loss is 0.0064\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8860\n",
      "loss is 0.0064\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8880\n",
      "loss is 0.0064\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8900\n",
      "loss is 0.0064\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8920\n",
      "loss is 0.0064\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8940\n",
      "loss is 0.0063\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8960\n",
      "loss is 0.0063\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 8980\n",
      "loss is 0.0063\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9000\n",
      "loss is 0.0063\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9020\n",
      "loss is 0.0063\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9040\n",
      "loss is 0.0063\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9060\n",
      "loss is 0.0063\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9080\n",
      "loss is 0.0063\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9100\n",
      "loss is 0.0063\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9120\n",
      "loss is 0.0063\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9140\n",
      "loss is 0.0063\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9160\n",
      "loss is 0.0062\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9180\n",
      "loss is 0.0062\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9200\n",
      "loss is 0.0062\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9220\n",
      "loss is 0.0062\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9240\n",
      "loss is 0.0062\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9260\n",
      "loss is 0.0062\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9280\n",
      "loss is 0.0062\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9300\n",
      "loss is 0.0062\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9320\n",
      "loss is 0.0062\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9340\n",
      "loss is 0.0062\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9360\n",
      "loss is 0.0062\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9380\n",
      "loss is 0.0061\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9400\n",
      "loss is 0.0061\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9420\n",
      "loss is 0.0061\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9440\n",
      "loss is 0.0061\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9460\n",
      "loss is 0.0061\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9480\n",
      "loss is 0.0061\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9500\n",
      "loss is 0.0061\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9520\n",
      "loss is 0.0061\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9540\n",
      "loss is 0.0061\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9560\n",
      "loss is 0.0061\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9580\n",
      "loss is 0.0061\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9600\n",
      "loss is 0.0060\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9620\n",
      "loss is 0.0060\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9640\n",
      "loss is 0.0060\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9660\n",
      "loss is 0.0060\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9680\n",
      "loss is 0.0060\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9700\n",
      "loss is 0.0060\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9720\n",
      "loss is 0.0060\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9740\n",
      "loss is 0.0060\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9760\n",
      "loss is 0.0060\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9780\n",
      "loss is 0.0060\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9800\n",
      "loss is 0.0060\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9820\n",
      "loss is 0.0060\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9840\n",
      "loss is 0.0059\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9860\n",
      "loss is 0.0059\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9880\n",
      "loss is 0.0059\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9900\n",
      "loss is 0.0059\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9920\n",
      "loss is 0.0059\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9940\n",
      "loss is 0.0059\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9960\n",
      "loss is 0.0059\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 9980\n",
      "loss is 0.0059\n",
      "acc is 100.0000\n",
      "**********\n",
      "epoch 10000\n",
      "loss is 0.0059\n",
      "acc is 100.0000\n"
     ]
    }
   ],
   "source": [
    "# 开始训练\n",
    "for epoch in range(10000):\n",
    "    if torch.cuda.is_available():\n",
    "        x_data = Variable(x).cuda()\n",
    "        y_data = Variable(y).cuda()\n",
    "    else:\n",
    "        x_data = Variable(x)\n",
    "        y_data = Variable(y)\n",
    " \n",
    "    out = logistic_model(x_data)\n",
    "    loss = criterion(out, y_data)\n",
    "    print_loss = loss.data.item()\n",
    "    mask = out.ge(0.5).float()  # 以0.5为阈值进行分类\n",
    "    correct = (mask == y_data).sum()  # 计算正确预测的样本个数\n",
    "    acc = correct.item() / x_data.size(0)  # 计算精度\n",
    "    optimizer.zero_grad()\n",
    "    loss.backward()\n",
    "    optimizer.step()\n",
    "    # 每隔20轮打印一下当前的误差和精度\n",
    "    if (epoch + 1) % 20 == 0:\n",
    "        print('*'*10)\n",
    "        print('epoch {}'.format(epoch+1)) # 训练轮数\n",
    "        print('loss is {:.4f}'.format(print_loss))  # 误差\n",
    "        print('acc is {:.4f}'.format(acc))  # 精度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 结果可视化\n",
    "w0, w1 = logistic_model.lr.weight[0]\n",
    "w0 = float(w0.item())\n",
    "w1 = float(w1.item())\n",
    "b = float(logistic_model.lr.bias.item())\n",
    "plot_x = np.arange(-7, 7, 0.1)\n",
    "plot_y = (-w0 * plot_x - b) / w1\n",
    "plt.scatter(x.data.numpy()[:, 0], x.data.numpy()[:, 1], c=y.data.numpy(), s=100, lw=0, cmap='RdYlGn')\n",
    "plt.plot(plot_x, plot_y)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4 总结\n",
    "总结一下逻辑回归的优缺点。\n",
    "\n",
    "优点：\n",
    "\n",
    "1）预测结果是介于0和1之间的概率；\n",
    "\n",
    "2）可以适用于连续性和类别性自变量；\n",
    "\n",
    "3）容易使用和解释。\n",
    "\n",
    "缺点：\n",
    "\n",
    "1）对模型中自变量多重共线性较为敏感，例如两个高度相关自变量同时放入模型，可能导致较弱的一个自变量回归符号不符合预期，符号被扭转。需要利用因子分析或者变量聚类分析等手段来选择代表性的自变量，以减少候选变量之间的相关性；\n",
    "\n",
    "2）预测结果呈“S”型，因此从log(odds)向概率转化的过程是非线性的，在两端随着log(odds)值的变化，概率变化很小，边际值太小，slope太小，而中间概率的变化很大，很敏感。 导致很多区间的变量变化对目标概率的影响没有区分度，无法确定阀值。\n",
    "\n",
    "**参考**：\n",
    "\n",
    "https://blog.csdn.net/out_of_memory_error/article/details/81275651\n",
    "\n",
    "https://www.cnblogs.com/yiduobaozhiblog1/p/8872903.html\n",
    "\n",
    "https://blog.csdn.net/ligang_csdn/article/details/53838743\n",
    "\n",
    "https://baijiahao.baidu.com/s?id=1620514366177013756&wfr=spider&for=pc\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "study_python",
   "language": "python",
   "name": "study_python"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
